// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package term

import (
	"fmt"
	"gitee.com/go-wares/log/base"
	"gitee.com/go-wares/log/conf"
)

// Formatter
// is a component that convert log item to string.
type Formatter struct{}

// Format
// formats log item to string.
func (o *Formatter) Format(item *base.Item) (body []byte) {
	// Prefix
	// with time and level.
	str := fmt.Sprintf(`[%s][%s]`, item.Time.Format(conf.Get().TimeFormat), item.Level)

	// Tracing
	// fields combined.
	if item.SpanId != nil {
		str += fmt.Sprintf(`[%s:%d]`, item.SpanId.String(), item.SpanPosition)
	}

	// Contents and fields combined.
	if item.Field != nil {
		str += " " + item.JsonField()
	}
	str += " " + item.Text

	// Stack
	// combined for fatal level.
	if item.Level.IsFatal() && item.Stack != nil {
		str += "\n" + item.Stack.String()
	}
	return []byte(str)
}
